/*
 * Copyright 2011 Alex Paréj.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.mkdir.ejb;

import java.util.Collection;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.Resource;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.mail.Message;
import javax.mail.Message.RecipientType;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import org.apache.commons.lang3.Validate;
import org.mkdir.model.Dokumentum;
import org.mkdir.model.Felhasznalo;
import org.mkdir.util.FajlUtil;
import org.mkdir.util.StringUtil;
import org.mkdir.util.jsf.MessageBundle;

/**
 *
 * @author Alex Paréj
 */
@Stateless
@LocalBean
public class EmailService {

    @Resource(name = "mail/mkdir")
    private Session mailSession;

    public void emailRegisztralFelhasznalo(Felhasznalo felhasznalo, String jelszo) {
        String szoveg = MessageBundle.getMessage("emailRegisztracioUzenet", new String[]{jelszo});
        String uzenet = konvertalSablon(felhasznalo, szoveg);
        kuld(felhasznalo, MessageBundle.getMessage("emailRegisztracioTargy"), uzenet);
    }

    public void emailInaktivalFelhasznalo(Felhasznalo felhasznalo) {
        String szoveg = MessageBundle.getMessage("emailFelhasznaloInaktivalUzenet");
        String uzenet = konvertalSablon(felhasznalo, szoveg);
        kuld(felhasznalo, MessageBundle.getMessage("emailFelhasznaloInaktivalTargy"), uzenet);
    }
    public void emailAktivalFelhasznalo(Felhasznalo felhasznalo) {
        String szoveg = MessageBundle.getMessage("emailFelhasznaloAktivalUzenet");
        String uzenet = konvertalSablon(felhasznalo, szoveg);
        kuld(felhasznalo, MessageBundle.getMessage("emailFelhasznaloAktivalTargy"), uzenet);
    }

    public void emailUjJelszo(Felhasznalo felhasznalo, String jelszo) {
        String szoveg = MessageBundle.getMessage("emailUjJelszoUzenet", new String[]{jelszo});
        String uzenet = konvertalSablon(felhasznalo, szoveg);
        kuld(felhasznalo, MessageBundle.getMessage("emailUjJelszoTargy"), uzenet);
    }

    public void emailUjDokumentumMegosztva(Dokumentum dokumentum, Collection<Felhasznalo> felhasznalok) {
        for (Felhasznalo felhasznalo : felhasznalok) {
            emailUjDokumentumMegosztva(dokumentum.getLetrehozo(), felhasznalo, dokumentum);
        }
    }

    private void emailUjDokumentumMegosztva(Felhasznalo ki, Felhasznalo kivel, Dokumentum dokumentum) {
        String megoszto = ki.getEmail() + " (" + ki.getNev()+")";
        String dokumentumLeiras = dokumentum.getNev() + " (" + FajlUtil.getMeret(dokumentum.getMeret()) + ")";
        String szoveg = MessageBundle.getMessage("emailUjDokumentumMegosztvaUzenet", new String[]{megoszto, dokumentumLeiras});
        kuld(kivel, MessageBundle.getMessage("emailUjDokumentumMegosztvaTargy"), konvertalSablon(kivel, szoveg));
    }

    private String konvertalSablon(Felhasznalo cimzett, String szoveg) {
        StringBuilder uzenet = new StringBuilder();
        uzenet.append(MessageBundle.getMessage("emailMegszolitas", new String[]{cimzett.getNev()}));
        uzenet.append(StringUtil.ujSor()).append(szoveg);
        uzenet.append(StringUtil.ujSor()).append(MessageBundle.getMessage("emailAlairas"));
        return uzenet.toString();
    }

    private void kuld(Felhasznalo cimzett, String targy, String uzenet) {
        Validate.notNull(cimzett);
        Validate.notNull(targy);
        Validate.notNull(uzenet);
        if (cimzett.isEmailErtesites()) {
            try {
                Message msg = new MimeMessage(mailSession);
                msg.setSubject(targy);
                msg.setRecipient(RecipientType.TO, new InternetAddress(cimzett.getEmail()));
                msg.setText(uzenet);
                Transport.send(msg);
            } catch (Exception ex) {
                Logger.getLogger(EmailService.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
}
